package com.hb.trade.server.center.au.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hb.core.pojo.center.au.dto.RoleDTO;
import com.hb.core.pojo.center.au.dto.UserDTO;
import com.hb.core.pojo.center.au.entity.UserRole;
import com.hb.core.pojo.enums.RoleSignEnum;
import com.hb.core.pojo.enums.RoleTypeEnum;

import java.util.List;

/**
 * 角色关联中间表, 用于关联用户角色 服务类
 *
 * @author zhaojk
 * @since 2021-11-29
 */
public interface UserRoleService extends IService<UserRole> {

    /**
     * 给用户赋予指定的业务角色
     * 该方法将赋予指定角色的总公司管理员
     * 该方法会验证该userId是否为一级帐号, 只有一级帐号才能赋予总公司管理员角色
     *
     * @param userId   需要被赋予角色的用户ID
     * @param roleSign 业务角色只能是枚举中的一个
     * @return
     * @see com.hb.core.pojo.enums.RoleSignEnum
     */
    boolean grantRole(Long userId, RoleSignEnum... roleSign);

    /**
     * 更新用户指定的系统角色
     * 系统角色ID列表(列表中可以包括业务角色)
     *
     * @param user#id
     * @param user#roleIds
     * @return
     */
    boolean updateUserRoles(UserDTO user);

    /**
     * 获取指定用户的角色
     *
     * @param userId
     * @return
     */
    List<RoleDTO> listRolesByUserId(Long userId);

    /**
     * 查询指定用户列表的招投标业务角色
     * 会返回所有roleSign不为null的数据
     *
     * @param userIds
     * @return
     */
    List<RoleDTO> listBiddingRolesByUserIds(List<Long> userIds);

    /**
     * 判断用户ID列表中是否包含超级管理员
     *
     * @param userIds
     * @return
     */
    boolean containsAdmin(List<Long> userIds);

    /**
     * 给指定的用户添加企业管理员角色
     *
     * @param userId
     * @return
     */
    boolean grantOrgManager(Long userId);

    /**
     * 给指定的用户添加未审核的代理机构角色
     *
     * @param userId
     * @return
     */
    boolean grantUnCheckedAgency(Long userId);

    /**
     * @param userId:用户id
     * @param roleSign:角色
     * @Description:给指定的用户删除指定的角色
     * @Author: zhongdl
     * @Date:2022/3/25 10:03
     * @return: {@link boolean }
     **/
    boolean deleteRole(Long userId, RoleTypeEnum roleTypeEnum);

    /**
     * 查询指定角色下的用户列表
     *
     * @param roleId
     * @return
     */
    List<UserDTO> listMembersByRoleId(Long roleId);
}
